package parDef

import (
	"database/sql"
	"sync/atomic"
	"time"
)

type IdxSubColumnMe struct {
	ColumnType string `json:"columnType"` //--
	ColumnNull string `json:"columnNull"`
	ColumnName string `json:"columnName"` //--
	Collation  string `json:"collation"`
	ColumnSeq  string `json:"columnSeq"`
	IndexSeq   string `json:"indexSeq"`
	SubPart    int    `json:"subPart"` //前缀索引长度
}
type IndexColumnMe struct {
	Schema             string           `json:"databaseName"`
	Table              string           `json:"tableName"` //--
	IndexName          string           `json:"indexName"` //--
	IndexSeq           string           `json:"indexSeq"`
	ColumnMate         []IdxSubColumnMe `json:"Column"`
	IndexLengthDetails []int
	IndexMaxLength     int
	Null               string `json:"null"`
	AutoIncrement      string `json:"autoIncrement"`
	NonUnique          string `json:"nonUnique"`
	Cardinality        int64  `json:"cardinality"`   //--
	ColumnKey          string `json:"columnKey"`     //--判断是普通索引，还是唯一索引，还是普通索引
	IndexCategory      string `json:"indexCategory"` //--
}

type (
	LimitOffset struct {
		Pagination *int64
		Segment    int
		ModifyS    *int32
	}
	NullObject struct {
		NullBool       bool
		NullLeftSplit  bool //是否包含>= 或者<= null，如果为true，则表示包含，需要进行拆分
		NullRightSplit bool //是否包含>= 或者<= null，如果为true，则表示包含，需要进行拆分
	}
	PassParameter struct {
		ColumnType []string //索引列的数据类型
		Ws, Wc     []string
	}
	GetColumnTypeInput struct {
		LogSeq        int64
		Schema, Table string
		ColumnFilter  []string
		DB            map[string]*sql.DB
		Plan          map[string][]string
		Input         StartPartConfigInputP
	}
	SelectColumnInput struct {
		Schema, Table     string
		LogSeq            int64
		OutputColumnType  string //输出index||all，默认为索引列,all表示查询所有列，index表示查询索引列
		SelectColumn      []string
		IndexColumn       []string
		RowsActiveMapList map[string]string //行数据差异映射处理
	}
	WhereGenerateInput struct {
		NullConstraint    string //是否允许为null
		IndexColumn       []string
		NullBool          *int32 //bool         //当前是否需要判断null值
		ColMetaMap        []ColMetaMapS
		LeftDirection     *atomic.Value //[]map[string]string //包含columName、columnDataLeft、querySymbolLeft
		NewLeftDirection  []map[string]string
		RightDirection    *atomic.Value //[]map[string]string //包含columName、columnDataRight、querySymbolRight
		NewRightDirection []map[string]string
	}
	StartPartConfigInputP struct {
		Scn             string
		SqlExecStopTime time.Duration
		//Esa                 EncryptionProperties
		WhereSql            string
		WhereAdd            string
		SqlMode             bool
		TablePx             string
		FixRows             int64
		LowerCaseTableNames bool
		SqlLogBin           bool //是否忽略binlog
		//Partition           PartitionOptions
	}
	IndexPart struct {
		LogSeq              int64
		Error               string
		OutputColumnType    string
		Limit               LimitOffset
		Index               IndexColumnMe
		NewIndexCol         []string
		Column              []ColMetaMapS
		NullObject          NullObject
		PassP               PassParameter
		SelectColumn        SelectColumnInput
		WhereGenerate       WhereGenerateInput
		SpecifiedConditions bool
	}
)
